<?php
//permet de faire le mapping objet-relationnel des seances objet<-->seances bd
Class SeanceDAOMysql implements iDAO{
	
	
	protected $connexion;
	protected $table='seance';
	protected $filmDAO;
	protected $salleDAO;
	
	public function __construct (){
	
		$this->connexion=Connexion::getInstance()->getConnexion();
		$DAOfactory=AbstractDAOFactory::getDaoFactory(AbstractDAOFactory::MYSQL);
		//on integre ici d'autres dao pour la seance ca evite d' avoir acharger le film et la salle pour chaque seance dans les actions->tout est charge d'un coup
		//par contre il faut faire attention aux circularités quant on fait ca Dao1 qui appelle Dao2 qui lui meme appelle Dao1 dans le constructeur
		$this->filmDAO=$DAOfactory->getFilmDAO();
		$this->salleDAO=$DAOfactory->getSalleDAO();
		
	}
	
	//recupere toutes les seances
	public function getAll(){
	  $sql = "SELECT * FROM ".$this->table;
	  return $this->executeQuery($sql);
	}
	
	//recupere une seance par son id
	public function getById($id){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID=".$id;
	  return $this->executeQuery($sql);
	}
	//recupere une seance par sa date
	public function getByName($date){
	  $sql = "SELECT * FROM ".$this->table ." WHERE DATE_SEANCE LIKE '%".$date."%'";
	  return $this->executeQuery($sql);
	}
	
	//recupere les seances d'un film
	public function getSeancesByFilmId($idFilm){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID_FILM=".$idFilm;
	  return $this->executeQuery($sql);
	}
	
	//ici on execute une requete de type select et on renvoie un tableau composé d'objets
	public function executeQuery($sql) {
		
		$TabObjets = array();
        $result =$this->connexion->query($sql);
		$this->throwExceptionOnError();
		
		
		 if($result) {
           while($row = $result->fetch_object()){
					//on effectue le mapping entre nos objets et les données de la base
                	$seance = new Seance();
                	$seance->setId($row->ID);
                	$seance->setSalle(new Salle());
					$seance->setFilm(new Film());
					$seance->setDateSeance(stripslashes($row->DATE_SEANCE));
					$seance->setHeureSeance(stripslashes($row->HEURE_SEANCE));
					$seance->setNbPlacesDispo($row->NB_PLACE_DISPO);
					//on hydrate notre objet film en utilsant le dao film
					$filmTab=$this->filmDAO->getById($row->ID_FILM);
					$seance->setFilm($filmTab[0]);
					//on hydrate notre objet en utilsant le dao salle
					$salleTab=$this->salleDAO->getById($row->ID_SALLE);
					$seance->setSalle($salleTab[0]);
					//on renvoie tout ca sous forme de tableau
					$TabObjets[]=$seance;
			}
		}
		
		return $TabObjets;
	}

	//la fonction permet de rechercher avant un insert(si l'objet existe) ou un update (si on est bien train d'updater le bon enregistrement 
	public function research($seance)
	{
	
		$Tab=array();
		$sql = "SELECT * FROM ".$this->table ." WHERE DATE_SEANCE='".$seance->getDateSeance()."' AND ID_SALLE='".$seance->getSalle()->getId()."' AND ID_FILM='".$seance->getFilm()->getId()."' AND HEURE_SEANCE='".$seance->getHeureSeance()."'";
		$Tab=$this->executeQuery($sql);
	
		switch (count($Tab)){
			
			case 0:
					return true;
					break;
			
			case 1:
			
				if ($seance->getId()==$Tab[0]->getId()){
					return true;
					break;
				}
				else{
					return false;
					break;
				}
			
			default:
					return false;
					break;
		}
	}
	
	
	
	//methode permettant de modifier une seance en bd
	public function update($seance) {
		
		$sql="UPDATE ".$this->table." SET ID_SALLE=?, ID_FILM=?, DATE_SEANCE=?, HEURE_SEANCE=?, NB_PLACE_DISPO =? WHERE ID=?";
			//on prepare la requete
			$stmt = $this->connexion->prepare($sql);
			//on rempli avec les parametres necessaires à la requete parametree
			$stmt->bind_param('iissii', $seance->getSalle()->getId(), $seance->getFilm()->getId(),$seance->getDateSeance(),$seance->getHeureSeance(),$seance->getNbPlacesDispo(),$seance->getId());
         	//on execute la requete
			$stmt->execute();
			$this->throwExceptionOnError();
		
	}
	

	//methode permettant d inserer une seance en bd
	public function insert($seance) {
		
		$sql="INSERT INTO ".$this->table." (ID_SALLE,ID_FILM,DATE_SEANCE,HEURE_SEANCE ,NB_PLACE_DISPO) VALUES(?,?,?,?,?)";
		//on prepare la requete
		$stmt = $this->connexion->prepare($sql);
		//on rempli avec les parametres necessaires à la requete parametree
		$stmt->bind_param('iissi', $seance->getSalle()->getId(), $seance->getFilm()->getId(),$seance->getDateSeance(),$seance->getHeureSeance(),$seance->getSalle()->getNbPlacesSalle());
		//on execute la requete
		$stmt->execute();
		$this->throwExceptionOnError();
		//on renvoie l'id inseré 
	    return $this->connexion->insert_id;
	
	}
	
	//supression d'une seance
	public function delete($id){

		 $sql = "DELETE  FROM ".$this->table ." WHERE ID=?";
	 	 $stmt = $this->connexion->prepare($sql);
	     $stmt->bind_param('i', $id);
	 	 $stmt->execute(); 
	 	 $this->throwExceptionOnError();
	}

	
	
	//si quelque chose c'est mal passé
	private function throwExceptionOnError(){
	
		if($this->connexion->error){
			throw new Exception('Erreur mysql'.$this->connexion->error);
		}
	}
	
	
}

?>